#include<iostream>
#include <set>
#include<map>
#include<string>
#include<vector>
#include <numeric>
#include<algorithm>
#include<fstream>
#include<memory>
#include<limits>
#include <ratio>
#include <chrono>
#include<ctime>
#include <unordered_set>
#include <iterator>
#include <functional>
#include <forward_list>
#include <iomanip>
#include <regex>
#include <future>
#include <thread>

using namespace std;
using namespace std::placeholders;

void Chapter1_5()
{
	//Class Pair
	//std::pair<int, string> kvp = std::make_pair<int, string>(5, "kitty");

	/*std::vector<std::pair<int, string>> vctpair;
	vctpair.push_back(std::pair<int, string>(1, "11"));
	vctpair.push_back(std::pair<int, string>(1, "12"));
	vctpair.push_back(std::pair<int, string>(1, "11"));
	vctpair.push_back(std::pair<int, string>(1, "13"));
	vctpair.push_back(std::pair<int, string>(1, "11"));
	vctpair.push_back(std::make_pair(5, "kitty"));*/

	/*std::for_each(vctpair.begin(), vctpair.end(), [](std::pair<int, string> &kvp)
	{
	cout << kvp.first << "  " << kvp.second << endl;
	});

	for (auto& v : vctpair)
	{
	cout << v.first << "--" << v.second << endl;
	}*/

	//Class Tuple
	std::tuple<int, float, bool, double, string> tup;
	//tup = std::make_tuple(1, 2.5, true, 2.00000005, "������");
	//cout << get<0>(tup) << "--" << get<3>(tup) << endl;

	//shared_ptr
	std::shared_ptr<string> pKitty{ new string("kitty") };
	std::shared_ptr<string> pJerry = std::make_shared<string>("jerry");//�ȽϿ�Ͱ�ȫ��һ�η���

																	   //pKitty = new string("rose"); ������ָͨ�븳ֵ������ָ�뷽ʽ����
	pKitty.reset(new string("kate")); //��ȷ����ָͨ�븳ֵ������ָ��ʹ�� reset

	std::vector<std::shared_ptr<string>> spvct;
	spvct.push_back(pKitty);
	spvct.push_back(pJerry);
	spvct.push_back(pKitty);

	/*for (auto vct : spvct)
	{
	cout << *vct << "    ";
	}
	cout << pKitty.use_count() << endl;
	std::unique_ptr<int> uptr(new int(10));
	cout << *uptr << endl;*/

	//��ֵ��ֵ
	bool bNum = false;
	//cout << boolalpha << bNum<<endl;
	//cout << "max(int)" << numeric_limits<int>::max() << endl;//2147483647

	int a[] = { 1,2,5,8,6,9,10 };
	int b[] = { 10,9,8,8,6,2,1 };
	//cout <<"min��"<< min({ 34,2,5,8,6,9,10 }) << "    max��" << max({ 34,2,5,8,6,9,10 });

	/*for (auto v : a) cout << v << "  ";
	cout << endl;
	for (auto v : b) cout << v << "  ";
	cout << endl;*/
	std::swap(a, b);
	/*for (auto v : a) cout << v << "  ";
	cout << endl;
	for (auto v : b) cout << v << "  ";
	cout << endl;*/

	//��������
	//cout << std::ratio_add<std::ratio<2, 7>, std::ratio<2, 6>>::num;

	//�����ִ��ʱ��
	std::vector<std::pair<int, string>> vctpair;

	for (int i = 1; i <= 10000; ++i)
	{
		vctpair.push_back(std::pair<int, string>(i, std::to_string(i)));
	}

	int ncount = 0;

	auto start_time = chrono::system_clock::now();

	for (auto& v : vctpair)
	{
		if (v.first % 7 == 0) ++ncount;
	}
	cout << ncount << endl;

	//std::for_each(vctpair.begin(), vctpair.end(), [&](std::pair<int, string> &kvp)
	//{
	//	if (kvp.first % 7 == 0) ++ncount;
	//});
	//cout << ncount << endl;

	auto end_time = chrono::system_clock::now();
	auto diff = end_time - start_time;
	auto sec = chrono::duration_cast<chrono::microseconds>(diff);
	cout << "runtime��" << sec.count() << "    microseconds" << endl;

	std::chrono::system_clock::time_point tp;//ʱ���
	tp = std::chrono::system_clock::now();//��ǰʱ��
										  //ת���ɴ�ͳC��POSIX�ṩ��ʱ������time_t����:1970.1.1���������
	std::time_t time = std::chrono::system_clock::to_time_t(tp);
	string strtime = ctime(&time);//����ʱ���ʽ
	strtime.resize(strtime.size() - 1);//�Ƴ���ĩ�˵�newline�ַ�
	cout << strtime << endl;
}

void Chapter6_STL()
{
	//��������
	//std::set<int, greater<int>> Set{ 10,3,4,3,6,8 };
	//for (auto& s : Set) cout << s << "  ";
	//cout << endl<<endl;
	//std::multiset<int> mSet{ 10,3,4,3,6,8 };
	//for (auto& s : mSet) cout << s << "  ";
	//cout << endl << endl;
	//std::unordered_multiset<int> umSet{ 10,3,4,3,6,8,3 };
	//umSet.insert(9);
	//for (auto& elem : umSet) cout << elem << "  ";

	//Vector
	std::vector<int> vct{ 10,3,4,3,6,8 };
	//reverse(vct.begin(), vct.end());
	//cout << endl << endl;
	//copy(vct.begin(), vct.end(), ostream_iterator<int>(cout, "  "));
	//remove(vct.begin(), vct.end(), 3);
	//cout << endl << endl;
	//copy(vct.begin(), vct.end(), ostream_iterator<int>(cout, "  "));

	//������������
	//cout << endl << endl;
	//std::vector<string> coll;
	//copy(istream_iterator<string>(cin), istream_iterator<string>(), back_inserter(coll));
	//copy(coll.begin(), coll.end(), ostream_iterator<string>(cout, "  "));

	//��������
	class PrintElem
	{
	public:
		void operator()(int elem) const
		{
			cout << elem << "  ";
		}
	};

	//auto it = vct.begin();
	//vct.insert(it+1,5);
	//cout << endl << "vct��";
	//for_each(vct.begin(), vct.end(), PrintElem()); 
	////Binder
	////��vct�е����е�3�滻Ϊ42
	//replace_if(vct.begin(), vct.end(), bind(equal_to<int>(), _1, 3), 42);
	//cout << endl << "replace��";
	//for_each(vct.begin(), vct.end(), PrintElem());
	//
	////ɾ��vct�� 6-12��Ԫ��
	//vct.erase(remove_if(vct.begin(), vct.end(),
	//	bind(logical_and<bool>(),
	//		bind(greater_equal<int>(), _1, 6),
	//		bind(less_equal<int>(), _1, 12))),
	//	vct.end());
	//cout << endl << "erase��";
	//for_each(vct.begin(), vct.end(), PrintElem());
	//std::list<int> lst;
	//std::vector<int> v1(lst.begin(), lst.end()); //��������
	//std::vector<int> v2(std::make_move_iterator(lst.begin()),
	//	std::make_move_iterator(lst.end())); //�ƶ�����
	//std::vector<int> v3 = std::move(v1); // ����ò���v1�ˣ��Ƽ����ֹ��췽ʽ
	//std::list<int> lst{ 2,5,8,9,2,4,6,7,3,1,3,2,5 };
	//cout << endl;
	//for_each(lst.begin(), lst.end(), PrintElem());
	//lst.unique(); //�Ƴ��ظ�Ԫ�أ�ֻ��һ��
	//lst.splice(pos, l2); //��l2������Ԫ��move��lst��pos֮ǰ
	//lst.sort(); //Ĭ�� < ����
	//lst.sort(opt()); //����opt()׼������
	//lst.merge(c2); // ǰ��lst �� c2������,��c2ȫ��Ԫ��ת�Ƶ�lst�У��ϲ����lst��Ϊ������
	//lst.reverse(); //������Ԫ�ط���
	//std::list<int> lst2;
	//lst.sort();
	//lst2 = lst;
	//lst2.unique();
	//lst.merge(lst2);
	//std::forward_list<int> flst = { 1,2,3 };
	//auto preIter = flst.before_begin();//ǰһ��Ԫ��λ��
	//next(preIter);//��ʾ��ǰ����Ԫ�ص�λ��
	//flst.insert_after(flst.before_begin(), { 77,78,79 });
	//cout << endl;
	//for_each(lst.begin(), lst.end(), PrintElem());

	//int val;
	//s.count(val); //����Ԫ��val�ĸ���
	//s.find(val);  //���ҵ�һ��val,�Ҳ�������end()
	//s.lower_bound(val);  //���ص�һ�� >= val ��Ԫ��λ��lpos
	//s.upper_bound(val);  //���ص�һ�� > val ��Ԫ��λ��upos
	//s.equal_range(val);  //����һ��pair<lpos, upos>:��val��ȵ�Ԫ���γɵ�����
	////�� lpos == upos ,��˼��ϲ�����ֵͬԪ��
	//s.insert(val);  //����һ��val�Ŀ�����������Ԫ��λ��
	//s.insert(beg, end);  //������������Ԫ�صĿ������뵽s,�޷���ֵ
	//s.emplace(args...);  //����һ����argsΪ��ֵ��Ԫ��,��������ʱ����,������Ԫ��λ��
	//s.erase(val);  //�Ƴ���val��ȵ�����Ԫ�أ����ر��Ƴ���Ԫ�ظ���
	//s.erase(pos); //�Ƴ�pos�ϵ�Ԫ�أ��޷���ֵ
	//s.erase(beg, end);  //�Ƴ���������Ԫ�أ��޷���ֵ
	//std::multiset<int> s = { 1,5,5,5,5,464,87,3,90 };
	//s.insert(5);
	//s.insert(500);
	//auto ncount = s.count(5);
	//auto it = s.find(5);
	//if(it!=s.end())
	//auto res = s.erase(it);
	//cout << endl;
	//for_each(s.begin(), s.end(), PrintElem());

	std::map<int, string> mp;
	mp.insert({ 1,"kitty" });
	mp.insert({ 2,"rose" });
	mp.insert({ 3,"rose" });
	//mp.insert(std::map<int, string>::value_type(1, "jack"));  //ʹ��value_type������ʽ����ת��
	//mp.insert(decltype(mp)::value_type(1, "jack"));
	//mp.insert(std::pair<const int, string>(1, "jack"));  //ʹ��pair<>
	//mp.insert(std::make_pair(1, "jack")); //ʹ��make_pair():��������ʵ�ι���pair����

	if (!mp.insert({ 1,"kitty" }).second)
	{
		cout << "�����ظ���key" << endl;
	}

	for (auto& m : mp)
	{
		cout << m.first << "--" << m.second << endl;
	}

	//Ҳ����ʹ��for_each()��ӡ
	for_each(mp.begin(),mp.end(), [](const map<int, string>::value_type& elem)
	{
		cout << elem.first << "--" << elem.second << endl;
	});

	//����Key
	int nKey = 2;
	auto itFindKey = mp.find(nKey);
	if (itFindKey != mp.end())
	{
		cout << "�ҵ�key��" << itFindKey->first << "-->" << itFindKey->second << endl;
	}

	//����Value
	string strFindValue = "rose";
	auto itFindValue=find_if(mp.begin(),mp.end(),[&strFindValue](const map<int,string>::value_type& kv)
	{
		return kv.second == strFindValue;
	});
	if (itFindValue != mp.end())
	{
		cout << "�ҵ�Value��" << itFindValue->second << "<--" << itFindValue->first << endl;
	}

	//set<string> st((istream_iterator<string>(cin)), istream_iterator<string>());
}

/**Chapter7_Map_STL()
	* ���ʹ��map,����ʹ�ù���ʽ���飨associative array���ӿ�
	* ��α�д��ʹ�ú�������function object��
	* ����������ڶ�������׼��sorting criterion��
	* ����ڡ���С�޹ء�������±Ƚ��ַ�����string��
*/

//�Ƚ��ַ����ĺ�������
class RuntimeStringCmp
{
public:
	enum cmp_mode { normal, nocase };

	RuntimeStringCmp(cmp_mode m = normal) :mode(m)
	{
	}

	bool operator()(const string& s1, const string& s2) const
	{
		if (mode == normal) {
			return s1 < s2;
		}
		else {
			return lexicographical_compare(s1.begin(), s1.end(), s2.begin(), s2.end(), nocase_compare);
		}
	}

private:
	const cmp_mode mode;

	static bool nocase_compare(char c1, char c2)
	{
		return toupper(c1) < toupper(c2);
	}
};

typedef multimap<string, string, RuntimeStringCmp> StringMap;

void InitAndPrintMap(StringMap& smap)
{
	smap.insert(
	{
		{ "Deutschland","Germany" },
		{ "deutsch","German" },
		{ "deutsch","German" },
		{ "Haken","snag" },
		{ "arbeiten","work" },
		{ "hund","dog" },
		{ "gehen","go" },
		{ "Unternehmen","enterprise" },
		{ "unternehmen","undertake" },
		{ "gehen","walk" },
		{ "Bestatter","undertaker" }
	});

	cout.setf(ios::left, ios::adjustfield);
	for (const auto& elem : smap)
	{
		cout << setw(15) << elem.first << "  " << elem.second << endl;
	}
	cout << endl;
}

void  Chapter7_Map_STL()
{
	StringMap smap1;
	InitAndPrintMap(smap1);
	RuntimeStringCmp ignorecase(RuntimeStringCmp::nocase);
	/*
		smap1ʹ��Ĭ�Ϻ�������������ΪRuntimeStringCmp
		�ú���������Ԫ�ص� operator < ִ�бȽ϶���	
	*/

	StringMap smap2(ignorecase);
	InitAndPrintMap(smap2);

	/*
		smap2ʹ������ΪRuntimeStringCmp�ĺ���������nocaseΪ��ֵ
		nocase����������������ԡ���Сд�޹ء�ģʽ����ַ����ıȽϺ�����

		���ǣ�ʹ��map���ִ�ӡ�����������Unternehmen��unternehmen����Ϊ������ͬ���ַ�����
		ԭ��valueӦΪ"enterprise"���Ǹ�key����valueȴ�����"undertake"
	*/

	/*Map������:
	Bestatter        undertaker
	Deutschland      Germany
	Haken            snag
	Unternehmen      enterprise
	arbeiten         work
	deutsch          German
	gehen            go
	hund             dog
	unternehmen      undertake

	arbeiten         work
	Bestatter        undertaker
	deutsch          German
	Deutschland      Germany
	gehen            go
	Haken            snag
	hund             dog
	Unternehmen      enterprise
	*/
	/*Multimap������:
	Bestatter        undertaker
	Deutschland      Germany
	Haken            snag
	Unternehmen      enterprise
	arbeiten         work
	deutsch          German
	deutsch          German
	gehen            go
	gehen            walk
	hund             dog
	unternehmen      undertake

	arbeiten         work
	Bestatter        undertaker
	deutsch          German
	deutsch          German
	Deutschland      Germany
	gehen            go
	gehen            walk
	Haken            snag
	hund             dog
	Unternehmen      enterprise
	unternehmen      undertake
	*/
}

//2.bind()�󶨵�ȫ�ֺ���
char myToupper(char c)
{
	std::locale loc;
	return std::use_facet<std::ctype<char>>(loc).toupper(c);
}

//3.bind()�󶨳�Ա����
class Person
{
public:
	Person(const string& n):name(n){}
	void print() const
	{
		cout << name << endl;
	}

	void PrefixPrint(const string& prefix) const
	{
		cout << prefix << name << endl;
	}

private:
	string name;
};

void Chapter10_FunctionAdapter()
{
	//1.�󶨺�������
	auto plus10 = bind(std::plus<int>(), 20, _2);
	cout << "plus10��" << plus10(55, 100) << endl;

	auto plus10times2 = std::bind(std::multiplies<int>(),
		std::bind(std::plus<int>(), std::placeholders::_1, 10),//��bind��Ϊplus10times2��һ��ʵ��
		2);//�ڶ���ʵ��
	cout << "plus10times2��" << plus10times2(7) << endl;//7������һ��ʵ��bind�е�_1

	//2.��ȫ�ֺ���
	string s("Internationalization");
	string sub("Nation");

	auto pos = search(s.begin(), s.end(), sub.begin(), sub.end(),
		bind(equal_to<char>(),
			bind(myToupper, _1),
			bind(myToupper, _2)
		)
	);

	if (pos != s.end())
	{
		cout << "\"" << sub << "\"is part of\"" << s << "\"" << endl;
	}

	//3.�󶨳�Ա����:bind()�ĵ�һ��ʵ���ǳ�Ա����,�ڶ���ʵ���Ƕ���
	vector<Person> vctPerson = { Person("kitty"),Person("Rose"),Person("jerry") };

	//�����е�ÿһ��Ԫ��ʵ�δ��� _1 ,Ȼ���ٴ���bind�󶨵ĳ�Ա����print()
	for_each(vctPerson.begin(), vctPerson.end(), bind(&Person::print, _1));//��ӡ��������������
	 //����print�ǳ�Ա���������� _1���������Ե��ó�Ա�����Ķ���

	cout << endl << endl;

	//paraml1.prefixPrint("Name��")
	for_each(vctPerson.begin(), vctPerson.end(), bind(&Person::PrefixPrint, _1, "Name��"));
	//paraml1.prefixPrint("Name��")

	cout << endl << endl;

	bind(&Person::PrefixPrint, _1, "TempPerson��")(Person("kate"));//��ӡ��ʱ����
	cout << endl << endl;
	// <==> 
	Person per("kate");
	bind(&Person::PrefixPrint, _1, "TempPerson��")(per);
}

void Chapter13_String()
{
	string s = "�ܼ�(���ܼ�)";
	string s0 = "�ܼ�(���ܼ�)";
	string s1 = "�ܼ�";
	string s2 = "���ܼ�";
	string s3 = "�ܼ�01";

	//auto findsub = search(s.begin(),s.end(),s1.begin(),s1.end());
	auto pos = s.find(s1);
	cout << pos << endl;
	if (s.find(s3) != string::npos)
	{
		cout << "ƥ��" << endl;
	}
	else
	{
		cout << "��ƥ��" << endl;
	}
}

void Chapter11_Algorithm()
{
	//_if:Ҫ�����ĺ�����������
	//_copy:Ԫ�ز�ֻ�����������ᱻ���Ƶ�Ŀ������

	//1.�Ǹ������㷨���Ȳ��Ķ�Ԫ�ش���Ҳ���Ķ�Ԫ��ֵ
	for_each()  //��ÿ��Ԫ��ִ�в���
	equal()  //�ж��������Ƿ����
	count()  //����Ԫ�ظ���
	count_if()  //��������������Ԫ�ظ���
	min_element()  //��СֵԪ��
	max_element()  //���ֵ

	find()  //������ĳֵ��ȵ� ��һ��Ԫ��
	find_if()  //�������������� ��һ��Ԫ��
	find_if_not()  //���Ҳ����������� ��һ��Ԫ��
	find_end()  //����ĳ��������� ���һ�γ���λ��
	find_first_of()  //���Ҷ��Ԫ���е� ��һ�����ֵ�Ԫ��

	adjacent_find() //��������������ȵ�Ԫ��
	is_permutation()  //���� ���� �����Ƿ������Ԫ��
	mismatch()  //���������и����ӦԪ���еĵ�һ�Բ����Ԫ��

	lexicographical_compare()  //�ж����ֵ�˳����ĳ�����Ƿ�С����һ����
	is_sorted()  //�Ƿ������ڵ�Ԫ��������
	is_sorted_until()  //���������ڵ�һ��δ��ѭ����׼���Ԫ��
	is_partitioned()  //�����ڵ�Ԫ���Ƿ����ĳ��׼�򱻷�Ϊ����
	partition_point()  //���������ڵ�һ���ָ�Ԫ��,һ������ĳ��׼��,��һ�鲻����
	is_heap()  //�Ƿ������ڵ�Ԫ���γ�һ��heap
	is_heap_until()  //�����ڵ�һ��δ��ѭheap����׼���Ԫ��

	all_of()  //�Ƿ� ����Ԫ�ض�����׼��
	any_of()  //�Ƿ� ������һ��Ԫ�ط���׼��
	none_of()  //�Ƿ� ���κ�Ԫ�ط���׼��

	//����             
   //String����       STL�㷨
	find()                      find()                 //ĳ�ַ� ��һ�γ��ֵ�λ��
	rfind()                     find() reverse_iterator  //ĳ�ַ� ���һ�γ��ֵ�λ��
	find()                      search()              //ĳ������ ��һ�γ��ֵ�λ��
	rfind()                     find_end()          //ĳ������ ���һ�γ��ֵ�λ��
	find_first_of()        find_first_of()    //���Ҷ��Ԫ���е� ��һ�����ֵ�Ԫ��
	find_last_of()        reverse_iterator  //���Ҷ��Ԫ���е� ���һ�����ֵ�Ԫ��
		                            search_n()           //n������Ԫ�ص�һ�γ��ֵ�λ��

	//2.�������㷨��ֱ�Ӹı�Ԫ��ֵ�����ڸ���Ԫ�ص���һ������Ĺ����иı�Ԫ��ֵ
	for_each()	//����ÿһ��Ԫ��
	copy()  //�ӵ�һ��Ԫ�ؿ�ʼ����ĳ������
	copy_if()  //���Ʒ���׼���Ԫ��
	copy_n()  //����n��Ԫ��
	copy_backward()  //�����һ��Ԫ�ؿ�ʼ����ĳ������

	move()  //�ӵ�һ��Ԫ�ؿ�ʼ�ƶ�ĳ������
	move_backward()  //�����һ��Ԫ�ؿ�ʼ�ƶ�ĳ������
	transform()  //�Ķ�������Ԫ�أ������������Ԫ�غϲ�
	merge()  //�ϲ��������� ����һ����
	swap_ranges()  //�����������Ԫ��
	fill()  //�Ը���ֵ�滻 ÿһ��Ԫ��
	fill_n()  //�Ը���ֵ�滻n��Ԫ��
	generate()  //��ĳ������Ľ���滻ÿһ��Ԫ��
	generate_n()  //��ĳ������Ľ���滻n��Ԫ��

	iota()  //������Ԫ����һϵ�еĵ���ֵȡ��
	replace()  //������ĳ�ض�ֵ��Ԫ���滻Ϊ��һ��ֵ
	replace_if()  //������׼���Ԫ���滻Ϊ��һ��ֵ
	replace_copy()  //�����������䣬��������ĳ�ض�ֵ��Ԫ���滻Ϊ��һ��ֵ
	replace_copy_if()  //�����������䣬��������׼���Ԫ���滻Ϊ��һ��ֵ

   //3.�Ƴ����㷨���߼����Ƴ�--����Ӧ�Ƴ���Ԫ����ǰ�����Ƴ���Ԫ��
	//���ı���������Ԫ�ظ����������߼������յ��λ��
	remove()  //�� ����ĳ�ض�ֵ��Ԫ�� ȫ���Ƴ�
	remove_if()  //������ĳ׼���Ԫ��ȫ���Ƴ�
	remove_copy()  //�� ������ ĳ�ض�ֵ��Ԫ��ȫ�����Ƶ���
	remove_copy_if()  //�� ������׼�� ��Ԫ��ȫ�����Ƶ���
	unique()  //�Ƴ����ڵ��ظ�Ԫ��
	unique_copy()  //�Ƴ����ڵ��ظ�Ԫ�أ������Ƶ���

	//4.�������㷨���ı�Ԫ��˳�򵫲��ı�Ԫ��ֵ
	reverse()  //��Ԫ�صĴ�����ת
	reverse_copy()  //���Ƶ�ͬʱ����תԪ�ش���
	rotate()  //��תԪ�ش���
	rotate_copy()  //���Ƶ�ͬʱ��תԪ�ش���
	next_permutation()  //�õ�Ԫ�ص���һ�����д���
	prev_permutation()  //�õ�Ԫ�ص���һ�����д���
	shuffle()  //��Ԫ�صĴ����������
	random_shuffle()  //��Ԫ�صĴ����������

	partition()  //�ı�Ԫ�ش���ʹ����׼���Ԫ���Ƶ�ǰ��
	stable_partition()  //����Ԫ�ص����˳��
	partition_copy()  //�ı�Ԫ�ش���ʹ����׼��Ԫ���Ƶ�ǰ�棬�����лḴ��Ԫ��

	//5.�����㷨:
	sort()  //��ͳ���ÿ�������nlog(n)
	stable_sort()  //�������Ԫ��֮�����Դ��򣺲��ù鲢����
	partial_sort()  //��ǰn��Ԫ������,��ɺ�����ֹͣ������heapsort�κ������֤ʱ�临�Ӷ�nlog(n)
	partial_sort_copy()  //�����������Ƶ���
	nth_element()  //���ݵ�n��λ�ý�������

	make_heap()  //��ĳ������ת����һ����
	push_heap()  //��Ԫ�ؼ���һ����
	pop_heap()  //��heap�Ƴ�һ��Ԫ��
	sort_heap()  //�Զѽ�������֮�����Ǹ����ˣ�

	//6.�����������㷨
	binary_search()  //�ж�ĳ�����Ƿ����ĳ��Ԫ��
	includes()  //�ж�ĳ�����ÿһ��Ԫ���Ƿ񶼺�������һ��������
	lower_bound()  //���ҵ�һ�� ���ڵ���ĳֵ ��Ԫ��
	upper_bound()  //���ҵ�һ�� ���ڸ���ֵ ��Ԫ��
	equal_range()  //���� ���ڸ���ֵ ������Ԫ�ع��ɵ�����

	set_union()  //�����䲢��
	set_intersection()  //�����佻��
	set_difference()  //���λ�ڵ�һ���䵫��λ�ڵڶ������������Ԫ������
	set_symmetric_difference()  //�ҳ�ֻ������������֮һ������������Ԫ������

	inplace_merge()  //���������������������ϲ�
	partition_point()  //��һ���ж�ʽ�ָ����䣬���طָ�Ԫ��

	//7.��ֵ�㷨
	accumulate()  //���ܺ͡��ܳ˻����ַ�������Ч��
	inner_product()  //�����������Ԫ��
	adjacent_difference()  //��ÿ��Ԫ�غ�ǰһԪ�ؽ��
	partial_sum()  //��ÿ��Ԫ�غ�֮ǰ����Ԫ�ؽ��

}


void Chapter13_String()
{
	append()  //�����ַ�
	resize()  //�ı��ַ���������β��ɾ���������ַ�
	capacity()  //�����ط���ǰ���ַ�����
	front() back()  //���ʵ�һ�������һ���ַ�
    >>, getline()  //��һ��stream��ȡĳֵ
	>>  //��ĳֵд��stream
	stoi() stol() stoll()  //string -- �������ŵ�����
	stoul() stoull()  //string -- ���������ŵ�����
	stof() stod() stold()  //string -- ������
	to_string() to_wstring()  //���������� -- string
	data() c_str()  //��string������C-string�ַ�������ʽ����(�ں�\0)
	
	size() length()  //����string���е��ַ���������������Ч
	//[]������������Ƿ���Ч, at()�����
	//��һ���յ�string����back()���ᵼ�²���ȷ����Ϊ
	int string::compare(const string &str) const  //��string *this������string str�Ƚ�
	s.compare(s2)  //0��ʾ���, <0��ʾС��, >0��ʾ����
	s.assign(s2)  //��ֵ
	s.insert(pos,s2)  //s2���뵽pos֮��
	empty()  //�ж��Ƿ�Ϊ��,�ȼ��� string::size() == 0 ,�����ܸ���
	shrink_to_fit()  //�����ڲ��ڴ��Է��ϵ�ǰ�ַ���

	I/O����
	>>��input stream��ȡһ��string
	<<��һ��stringд��output stream��
	Stream width()����Ϊ0
	std::getline() �ú�����ȡ�����ַ�
	������ͷ�Ŀհ��ַ�ֱ���������з���end-of-file

	auto nPos = s.find(s2)  //�����ַ����з��������ĵ�һ���ַ�������
	���Ҳ�������string::npos(-1ת����Ϊ���������������ֵ)
	ע�⣺nPos���ܶ���Ϊint��unsigned����
	����ò���nPos�����ֱ���ã�if(s.find(s2) != string::npos)
	��ֵת������������ǰ���ո�

	string s1;
	string s3 = "";
	string s2 = "xuxueqian";

	auto it = s2.find(s1);
	if (it != string::npos)
	{
		cout << "�ҵ�" << endl;
	}
	else
	{
		cout << "û�ҵ�" << endl;
	}
}

void Chapter14_Regex()
{
	//ECMAScript�ķ���
	/*
	.	newline������κ��ַ�
	*/
	//Regex��������֮ǩ��ʽ
	bool regex_match();
	bool regex_search();
	bool regex_replace();
}

void Chapter15_Stream()
{
	Stream����һ��������, stream����ĳ��class������������ض����ʵĶ���
	����ȼ���"��������stream",����ȼ���"��������stream"
	istream���������� ostream����д����
	endl  //���\n��ˢ��output������
	ends  //���\0
	flush  //ˢ��output������
	ws      //���벢���Կհ��ַ�

	auto now = chrono::system_clock::now();
	time_t t = chrono::system_clock::to_time_t(now);
	tm *nowTm = localtime(&t);
	cout << put_time(nowTm,"date��%x\ntime��%X\n") << endl;
	date��03 / 06 / 19
	time��13:59 : 25

	boolalpha  //���true false ��ʽ
	15.7.6��������ʾ��

	�ļ�����
	��C���ļ����ʻ������,C++ �ļ������ô����ļ��Զ�����,�ļ��ڹ���ʱ�Զ��򿪣�����ʱ�Զ��ر�
	in  //�򿪣����ڶ�ȡ(ifstreamĬ��)
	out  //�򿪣���պ�����д��(ofstreamĬ��)
	app  //д��ʱʼ��������β��
	ate  //at end ���ļ������дλ���Ƶ��ļ�β��
	trunc  //�Ƴ���ǰ���ļ�����
	binary  //������ģʽ:���������ַ������в��滻�����ַ�

	open(name)  //��Ĭ�Ϸ�ʽ���ļ�
	open(name,flags)  //��flags��ʽ���ļ�
	close()  //�ر��ļ�
	is_open()  //�ж��ļ��Ƿ񱻴�
	file.clear()  //����������ļ�β�˵�flag
}

void WriteStringToFile(const string& filename)
{
	ofstream file(filename);

	if (!file)
	{
		cerr << "can't open the file\"" << filename << "\"" << endl;
	}

	for (int i = 32; i < 256; ++i)
	{
		file << "value��" << setw(3) << i << "    " << "char��" << static_cast<char>(i) << endl;
	}
}

void ReadFile(const string& filename)
{
	ifstream file(filename);

	if (!file)
	{
		cerr << "can't open the file\"" << filename << "\"" << endl;
	}

	char c;
	while (file.get(c))
	{
		cout.put(c);
	}
}

int fun(){}
int fun1(){}
int fun2(){}

void Chapter18_Concurrency()
{
	auto res = fun1() + fun2();

	std::future<int> res1(std::async(fun1));
	int res2 = fun2();
	int result = res1.get() + res2;
	async()���Խ�������õĺ��������첽������һ�������߳���
	���fun1()�������˲������main()ͣ��
	future object:
	������ȡ�ô���async()���Ǹ�������δ�����---Ҳ���Ǹ�����ֵҲ���Ǹ��쳣
	��������ڣ�ȷ��Ŀ�꺯���������ջᱻ����
	get()
	���fun1()��async()������һ�������̲߳����ѽ����������̻�ý��;
	���fun1()����������δ������get()������ͣ��(block)��fun1()�������ý��;
	���fun1()��δ��������ǿ������һ��ͬ������,get()������ͣ��ֱ�����������
	һ��future<>ֻ�ܱ�����get()һ��,����֮��future�ʹ�����Ч״̬
	
	Launch(����)���ԣ�����ǿ��async()��������Ŀ�꺯����ִ�У�ֻҪ��ȷ����һ��
	launch��������ָ��async()������������������ʱӦ��ȷ�����첽��ʽ����Ŀ�꺯����
	std::future<int> rest = std::async(std::launch::async, fun1);
}
